package com.github.yangyishe.p100;

/**
 * 79. 单词搜索
 * https://leetcode.cn/problems/word-search/description/?envType=study-plan-v2&envId=top-interview-150
 *
 * 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中，返回 true ；否则，返回 false 。
 *
 * 单词必须按照字母顺序，通过相邻的单元格内的字母构成，其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
 *
 *
 *
 * 示例 1：
 *
 *
 * 输入：board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
 * 输出：true
 * 示例 2：
 *
 *
 * 输入：board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
 * 输出：true
 * 示例 3：
 *
 *
 * 输入：board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
 * 输出：false
 *
 *
 * 提示：
 *
 * m == board.length
 * n = board[i].length
 * 1 <= m, n <= 6
 * 1 <= word.length <= 15
 * board 和 word 仅由大小写英文字母组成
 *
 *
 * 进阶：你可以使用搜索剪枝的技术来优化解决方案，使其在 board 更大的情况下可以更快解决问题？
 */
public class Problem79 {
    public static void main(String[] args) {
        char[][] board = new char[][]{
                {'C','A','A'},
                {'A','A','A'},
                {'B','C','D'}
        };
        String word = "AAB";

        Problem79 problem79 = new Problem79();
        boolean exist = problem79.exist(board, word);
        System.out.println(exist);
    }

    /**
     * 思路:
     * 回溯.
     * @param board
     * @param word
     * @return
     */
    public boolean exist(char[][] board, String word) {
        char[] chars=word.toCharArray();

        for(int r=0;r<board.length;r++){
            for(int c=0;c<board[r].length;c++){
                findNext(board,r,c,chars,0);
                if(flag){
                    return true;
                }
            }
        }

        return false;
    }
    private boolean flag;

    private void findNext(char[][] board,int r,int c,char[] chars,int index){
        if(flag){
           return;
        }
        if(r<0||r>=board.length){
            return;
        }
        if(c<0||c>=board[0].length){
            return;
        }
        if(board[r][c]!=chars[index]){
            return;
        }
        if(index==chars.length-1){
            flag=true;
            return;
        }
        board[r][c]=' ';
        findNext(board,r-1,c,chars,index+1);
        findNext(board,r+1,c,chars,index+1);
        findNext(board,r,c-1,chars,index+1);
        findNext(board,r,c+1,chars,index+1);
        board[r][c]=chars[index];

    }
}
